package api

import (
	"gomain/app/model"
	"gomain/app/service"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

type RoleApi struct{}

// List 获取角色列表
func (a *RoleApi) List(r *ghttp.Request) {
	page := r.Get("page", 1).Int()
	limit := r.Get("limit", 10).Int()
	name := r.Get("name").String()

	m := g.DB().Model("roles")
	if name != "" {
		m = m.Where("name like ?", "%"+name+"%")
	}

	count, err := m.Count()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	var roles []model.Role
	err = m.Page(page, limit).Order("id desc").Scan(&roles)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code":  0,
		"msg":   "success",
		"count": count,
		"data":  roles,
	})
}

// Get 获取角色信息
func (a *RoleApi) Get(r *ghttp.Request) {
	id := r.Get("id").Int()
	var role *model.Role
	err := g.DB().Model("roles").Where("id", id).Scan(&role)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
		"data": role,
	})
}

// Add 添加角色
func (a *RoleApi) Add(r *ghttp.Request) {
	var role model.Role
	if err := r.Parse(&role); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 检查角色编码是否已存在
	count, err := g.DB().Model("roles").Where("code", role.Code).Count()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}
	if count > 0 {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  "角色编码已存在",
		})
		return
	}

	// 插入数据,让数据库自动生成id
	_, err = g.DB().Model("roles").Data(g.Map{
		"name":   role.Name,
		"code":   role.Code,
		"status": role.Status,
	}).Insert()

	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "添加成功",
	})
}

// Update 更新角色
func (a *RoleApi) Update(r *ghttp.Request) {
	var role model.Role
	if err := r.Parse(&role); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 检查角色名是否已存在(排除自己)
	count, err := g.DB().Model("roles").
		Where("name", role.Name).
		Where("id != ?", role.Id).
		Count()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}
	if count > 0 {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  "角色名已存在",
		})
		return
	}

	// 更新数据
	_, err = g.DB().Model("roles").
		Where("id", role.Id).
		Data(role).
		Update()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "更新成功",
	})
}

// Delete 删除角色
func (a *RoleApi) Delete(r *ghttp.Request) {
	id := r.Get("id")
	_, err := g.DB().Model("roles").Where("id", id).Delete()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "删除成功",
	})
}

// BatchDelete 批量删除角色
func (a *RoleApi) BatchDelete(r *ghttp.Request) {
	var ids []int
	if err := r.Parse(&ids); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	_, err := g.DB().Model("roles").WhereIn("id", ids).Delete()
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "删除成功",
	})
}

// GetPermissions 获取角色权限
func (a *RoleApi) GetPermissions(r *ghttp.Request) {
	roleId := r.Get("id").Int()
	if roleId == 0 {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  "角色ID不能为空",
		})
		return
	}

	var permissions []int
	err := g.DB().Model("role_permissions").
		Where("role_id", roleId).
		Fields("permission_id").
		Scan(&permissions)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	// 如果没有权限，返回空数组而不是null
	if permissions == nil {
		permissions = make([]int, 0)
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "success",
		"data": permissions,
	})
}

// AssignPermissions 分配权限
func (a *RoleApi) AssignPermissions(r *ghttp.Request) {
	var req struct {
		RoleId        int   `v:"required#角色ID不能为空"`
		PermissionIds []int `v:"required#权限ID不能为空"`
	}

	if err := r.Parse(&req); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	err := service.Role.AssignPermissions(req.RoleId, req.PermissionIds)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 1,
			"msg":  err.Error(),
		})
		return
	}

	r.Response.WriteJson(g.Map{
		"code": 0,
		"msg":  "配置成功",
	})
}
